home *** CD-ROM | disk | FTP | other *** search
JavaScript | 2000-04-19 | 13.2 KB | 530 lines | [TEXT/MOSS] |
- /*
- * The contents of this file are subject to the Netscape Public
- * License Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All
- * Rights Reserved.
- *
- * Contributor(s):
- */
-
- function FillRecipientTypeCombobox()
- {
- top.MAX_RECIPIENTS = 1;
-
- var body;
-
- for ( var row = 2; row <= top.MAX_RECIPIENTS; row++ )
- {
- body = document.getElementById('addressWidgetBody');
-
- awCopyNode(awGetTreeItem(1), body, 0);
- }
- }
-
- function Recipients2CompFields(msgCompFields)
- {
- if (msgCompFields)
- {
- var i = 1;
- var addrTo = "";
- var addrCc = "";
- var addrBcc = "";
- var addrReply = "";
- var addrNg = "";
- var addrFollow = "";
- var addrOther = "";
- var to_Sep = "";
- var cc_Sep = "";
- var bcc_Sep = "";
- var reply_Sep = "";
- var ng_Sep = "";
- var follow_Sep = "";
-
- while ((inputField = awGetInputElement(i)))
- {
- fieldValue = inputField.value;
- if (fieldValue != "")
- {
- switch (awGetPopupElement(i).value)
- {
- case "addr_to" : addrTo += to_Sep + fieldValue; to_Sep = ","; break;
- case "addr_cc" : addrCc += cc_Sep + fieldValue; cc_Sep = ","; break;
- case "addr_bcc" : addrBcc += bcc_Sep + fieldValue; bcc_Sep = ","; break;
- case "addr_reply" : addrReply += reply_Sep + fieldValue; reply_Sep = ","; break;
- case "addr_newsgroups" : addrNg += ng_Sep + fieldValue; ng_Sep = ","; break;
- case "addr_followup" : addrFollow += follow_Sep + fieldValue; follow_Sep = ","; break;
- case "addr_other" : addrOther += other_header + ": " + fieldValue + "\n"; break;
- }
- }
- i ++;
- }
- msgCompFields.SetTo(addrTo);
- msgCompFields.SetCc(addrCc);
- msgCompFields.SetBcc(addrBcc);
- msgCompFields.SetReplyTo(addrReply);
- msgCompFields.SetNewsgroups(addrNg);
- msgCompFields.SetFollowupTo(addrFollow);
- msgCompFields.SetOtherRandomHeaders(addrOther);
- }
- else
- dump("Message Compose Error: msgCompFields is null (ExtractRecipients)");
- }
-
- function CompFields2Recipients(msgCompFields)
- {
- if (msgCompFields)
- {
- var row = 1;
-
- row = awSetInputAndPopupFromArray(row, msgCompFields.SplitRecipients(msgCompFields.GetTo(), false), "addr_to");
- row = awSetInputAndPopupFromArray(row, msgCompFields.SplitRecipients(msgCompFields.GetCc(), false), "addr_cc");
- row = awSetInputAndPopupFromArray(row, msgCompFields.SplitRecipients(msgCompFields.GetBcc(), false), "addr_bcc");
- row = awSetInputAndPopupFromArray(row, msgCompFields.SplitRecipients(msgCompFields.GetReplyTo(), false), "addr_reply");
- row = awSetInputAndPopup(row, msgCompFields.GetOtherRandomHeaders(), "addr_other");
- row = awSetInputAndPopup(row, msgCompFields.GetNewsgroups(), "addr_newsgroups");
- row = awSetInputAndPopup(row, msgCompFields.GetFollowupTo(), "addr_followup");
-
- if ( row > 1 ) row--;
-
- // remove extra rows
- while ( top.MAX_RECIPIENTS > row )
- awRemoveRow(top.MAX_RECIPIENTS);
-
- setTimeout("awFinishCopyNodes();", 0);
- }
- }
-
- function awSetInputAndPopup(firstRow, inputValue, popupValue)
- {
- var row = firstRow;
-
- if ( inputValue && popupValue )
- {
- var addressArray = inputValue.split(",");
-
- for ( var index = 0; index < addressArray.length; index++ )
- {
- // remove leading spaces
- while ( addressArray[index][0] == " " )
- addressArray[index] = addressArray[index].substring(1, addressArray[index].length);
-
- // we can add one row if trying to add just beyond current size
- if ( row == (top.MAX_RECIPIENTS + 1))
- {
- var body = document.getElementById('addressWidgetBody');
- awCopyNode(awGetTreeItem(1), body, 0);
- top.MAX_RECIPIENTS++;
- }
-
- // if row is legal then set the values
- if ( row <= top.MAX_RECIPIENTS )
- {
- awGetInputElement(row).value = addressArray[index];
- awGetPopupElement(row).value = popupValue;
- row++;
- }
- }
-
- return(row);
- }
- return(firstRow);
- }
-
- function awSetInputAndPopupFromArray(firstRow, inputArray, popupValue)
- {
- var row = firstRow;
-
- if ( inputArray && popupValue )
- {
- for ( var index = 0; index < inputArray.count; index++ )
- {
- // remove leading spaces
- inputValue = inputArray.StringAt(index);
- while ( inputValue[0] == " " )
- inputValue = inputValue.substring(1, inputValue.length);
-
- // we can add one row if trying to add just beyond current size
- if ( row == (top.MAX_RECIPIENTS + 1))
- {
- var body = document.getElementById('addressWidgetBody');
- awCopyNode(awGetTreeItem(1), body, 0);
- top.MAX_RECIPIENTS++;
- }
-
- // if row is legal then set the values
- if ( row <= top.MAX_RECIPIENTS )
- {
- awGetInputElement(row).value = inputValue;
- awGetPopupElement(row).value = popupValue;
- row++;
- }
- }
-
- return(row);
- }
- return(firstRow);
- }
-
- function awNotAnEmptyArea(event)
- {
- //This is temporary until i figure out how to ensure to always having an empty space after the last row
- dump("awNotAnEmptyArea\n");
-
- var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
- if ( lastInput && lastInput.value )
- awAppendNewRow(false);
-
- event.preventBubble();
- }
-
- function awClickEmptySpace(setFocus)
- {
- dump("awClickEmptySpace\n");
- var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
-
- if ( lastInput && lastInput.value )
- awAppendNewRow(setFocus);
- else
- if (setFocus)
- awSetFocus(top.MAX_RECIPIENTS, lastInput);
- }
-
- function awReturnHit(inputElement)
- {
- var row = awGetRowByInputElement(inputElement);
-
- if ( inputElement.value )
- {
- var nextInput = awGetInputElement(row+1);
- if ( !nextInput )
- awAppendNewRow(true);
- else
- awSetFocus(row+1, nextInput);
- }
- }
-
- function awInputChanged(inputElement)
- {
- dump("awInputChanged\n");
- AutoCompleteAddress(inputElement);
-
- //Do we need to add a new row?
- var lastInput = awGetInputElement(top.MAX_RECIPIENTS);
- if ( lastInput && lastInput.value && !top.doNotCreateANewRow)
- awAppendNewRow(false);
- top.doNotCreateANewRow = false;
- }
-
- function awAppendNewRow(setFocus)
- {
- var body = document.getElementById('addressWidgetBody');
- var treeitem1 = awGetTreeItem(1);
-
- if ( body && treeitem1 )
- {
- awCopyNode(treeitem1, body, 0);
- top.MAX_RECIPIENTS++;
-
- // focus on new input widget
- if (setFocus)
- {
- var newInput = awGetInputElement(top.MAX_RECIPIENTS);
- if ( newInput )
- awSetFocus(top.MAX_RECIPIENTS, newInput);
- }
- }
- }
-
-
- // functions for accessing the elements in the addressing widget
-
- function awGetPopupElement(row)
- {
- var treerow = awGetTreeRow(row);
-
- if ( treerow )
- {
- var popup = treerow.getElementsByTagName('SELECT');
- if ( popup && popup.length == 1 )
- return popup[0];
- }
- return 0;
- }
-
- function awGetInputElement(row)
- {
- var treerow = awGetTreeRow(row);
-
- if ( treerow )
- {
- var input = treerow.getElementsByTagName('INPUT');
- if ( input && input.length == 1 )
- return input[0];
- }
- return 0;
- }
-
- function awGetTreeRow(row)
- {
- var body = document.getElementById('addressWidgetBody');
-
- if ( body && row > 0)
- {
- var treerows = body.getElementsByTagName('treerow');
- if ( treerows && treerows.length >= row )
- return treerows[row-1];
- }
- return 0;
- }
-
- function awGetTreeItem(row)
- {
- var body = document.getElementById('addressWidgetBody');
-
- if ( body && row > 0)
- {
- var treeitems = body.getElementsByTagName('treeitem');
- if ( treeitems && treeitems.length >= row )
- return treeitems[row-1];
- }
- return 0;
- }
-
- function awGetRowByInputElement(inputElement)
- {
- if ( inputElement )
- {
- var treerow;
- var inputElementTreerow = inputElement.parentNode.parentNode;
-
- if ( inputElementTreerow )
- {
- for ( var row = 1; (treerow = awGetTreeRow(row)); row++ )
- {
- if ( treerow == inputElementTreerow )
- return row;
- }
- }
- }
- return 0;
- }
-
-
- // Copy Node - copy this node and insert ahead of the (before) node. Append to end if before=0
- function awCopyNode(node, parentNode, beforeNode)
- {
- dump("awCopyNode\n");
-
- // XXXwaterson Ideally, we'd just do this, but for bug 26528
- // (and some of the funky logic about the 'id' attribute in
- // awCopyNodeAndChildren).
- //
- //var newNode = node.cloneNode(true);
- var newNode = awCopyNodeAndChildren(node);
-
- if ( beforeNode )
- parentNode.insertBefore(newNode, beforeNode);
- else
- parentNode.appendChild(newNode);
- }
-
- function awCopyNodeAndChildren(node)
- {
- var newNode;
- if ( node.nodeName == "#text" )
- {
- // create new text node
- newNode = document.createTextNode(node.data);
- }
- else
- {
- // create new node
- if ( node.nodeName[0] >= 'A' && node.nodeName[0] <= 'Z' )
- newNode = createHTML(node.nodeName);
- else
- newNode = document.createElement(node.nodeName);
-
- var attributes = node.attributes;
-
- if ( attributes && attributes.length )
- {
- var attrNode, name, value;
-
- // copy attributes into new node
- for ( var index = 0; index < attributes.length; index++ )
- {
- attrNode = attributes.item(index);
- name = attrNode.nodeName;
- value = attrNode.nodeValue;
- if ( name != 'id' )
- newNode.setAttribute(name, value);
- }
- }
-
- if ( node.nodeName == "SELECT" )
- {
- // copy options inside of SELECT
- if ( newNode )
- {
- for ( var index = 0; index < node.options.length; index++ )
- {
- var option = new Option(node.options.item(index).text,
- node.options.item(index).value)
- newNode.add(option, null);
- }
- }
- }
- else
- {
- // children of nodes
- if ( node.childNodes )
- {
- var childNode;
-
- for ( var child = 0; child < node.childNodes.length; child++ )
- {
- childNode = awCopyNodeAndChildren(node.childNodes[child]);
-
- newNode.appendChild(childNode);
- }
- }
- }
-
- if ( node.nodeName == "INPUT" )
- {
- // copy the event handler, as it's not
- // sufficient to just set the attribute.
- newNode.onkeyup = node.onkeyup;
- }
- }
-
- return newNode;
- }
-
- function createHTML(tag)
- {
- return document.createElementWithNameSpace(tag, "http://www.w3.org/TR/REC-html40");
- }
-
- // remove row
-
- function awRemoveRow(row)
- {
- var body = document.getElementById('addressWidgetBody');
-
- awRemoveNodeAndChildren(body, awGetTreeItem(row));
-
- top.MAX_RECIPIENTS--;
- }
-
- function awRemoveNodeAndChildren(parent, nodeToRemove)
- {
- // children of nodes
- var childNode;
-
- while ( nodeToRemove.childNodes && nodeToRemove.childNodes.length )
- {
- childNode = nodeToRemove.childNodes[0];
-
- awRemoveNodeAndChildren(nodeToRemove, childNode);
- }
-
- parent.removeChild(nodeToRemove);
-
- }
-
- function awSetFocus(row, inputElement)
- {
- top.awRow = row;
- top.awInputElement = inputElement;
- top.awFocusRetry = 0;
- setTimeout("_awSetFocus();", 0);
- }
-
- function _awSetFocus()
- {
- var tree = document.getElementById('addressingWidgetTree');
- try
- {
- theNewRow = awGetTreeRow(top.awRow);
- //temporary patch for bug 26344
- awFinishCopyNode(theNewRow);
-
- tree.ensureElementIsVisible(theNewRow);
- top.awInputElement.focus();
- }
- catch(ex)
- {
- top.awFocusRetry ++;
- if (top.awFocusRetry < 3)
- {
- dump("_awSetFocus failed, try it again...\n");
- setTimeout("_awSetFocus();", 0);
- }
- else
- dump("_awSetFocus failed, forget about it!\n");
- }
- }
-
-
- //temporary patch for bug 26344
- function awFinishCopyNode(node)
- {
- // dump ("awFinishCopyNode, node name=" + node.nodeName + "\n");
- // Because event handler attributes set into a node before this node is inserted
- // into the DOM are not recognised (in fact not compiled), we need to parsed again
- // the whole node and reset event handlers.
-
- var attributes = node.attributes;
- if ( attributes && attributes.length )
- {
- var attrNode, name;
-
- for ( var index = 0; index < attributes.length; index++ )
- {
- attrNode = attributes.item(index);
- name = attrNode.nodeName;
- if (name.substring(0, 2) == 'on')
- {
- node.setAttribute(name, attrNode.nodeValue);
- // dump(" -->reset attribute " + name + "\n");
- }
- }
- }
-
- // children of nodes
- if ( node.childNodes )
- {
- var childNode;
-
- for ( var child = 0; child < node.childNodes.length; child++ )
- childNode = awFinishCopyNode(node.childNodes[child]);
- }
- }
-
-
- function awFinishCopyNodes()
- {
- for ( var row = 2; row <= top.MAX_RECIPIENTS; row++ )
- awFinishCopyNode(awGetTreeRow(row));
- }
-
-
- function awTabFromRecipient(element, event)
- {
- //If we are le last element in the tree, we don't want to create a new row.
- if (element == awGetInputElement(top.MAX_RECIPIENTS))
- top.doNotCreateANewRow = true;
- }